/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package ru.bfpro.blocksolution;

/**
 *
 * @author fbn
 */
public class Placement {
    private int X;
    private int Y;
    private Placement_Cell[][] Cells;

    public Placement(int x, int y) {
        X = x;
        Y = y;
        Cells = new Placement_Cell[y][x];
        // Инициализация массива 
        for (int i=0;i<this.Cells.length;i++){
            for (int j=0;j<this.Cells[i].length;j++) {
                Cells[i][j] = new Placement_Cell();
                Cells[i][j].setFig_number(0);
            }
        }
    }
    
    /**
     * @return the X
     */
    public int getX() {
        return X;
    }

    /**
     * @param X the X to set
     */
    public void setX(int X) {
        this.X = X;
    }

    /**
     * @return the Y
     */
    public int getY() {
        return Y;
    }

    /**
     * @param Y the Y to set
     */
    public void setY(int Y) {
        this.Y = Y;
    }

    /**
     * @return the cell
     */
    public Placement_Cell[][] getCell() {
        return Cells;
    }

    /**
     * @param cell the cell to set
     */
    public void setCell(Placement_Cell[][] cell) {
        this.Cells = cell;
    }
    
    /**
     * Отрисовка поля
     */
    public void Paint() {
        System.out.println("==== Расположение фигур на поле ====");        
        for (int y=0;y<this.Cells.length;y++){
            for (int x=0;x<this.Cells[y].length;x++) {
                System.out.print("[" + this.Cells[y][x].getFig_number() + "]");                
            }
            System.out.println();        
        }
    }
            
    /**
     * Размещение фигуры на поле
     * @param fig Фигура
     * @param x столбец поля размещения левой верхней ячейки фигуры
     * @param y строка поля размещения левой верхней ячейки фигуры
     * @_return Результат успешности
     */
    public void FigureAdd(Figure fig,int x,int y) {
        for (int fig_y=0; fig_y<fig.getPcs().length; fig_y++) {
           for (int fig_x=0; fig_x<fig.getPcs()[fig_y].length; fig_x++ ) {
            if (fig.getPcs()[fig_y][fig_x] == 1) {
                this.Cells[y+fig_y][x+fig_x].setFig_number(fig.getNumber());
                this.Cells[y+fig_y][x+fig_x].setFig_x(fig_x);
                this.Cells[y+fig_y][x+fig_x].setFig_y(fig_y);
            }
            fig.getCell_place()[fig_y][fig_x].place_x = x+fig_x;
            fig.getCell_place()[fig_y][fig_x].place_y = y+fig_y;
           }
        }
    }
    
    /**
     * Проверка возможности размещения фигуры на поле
     * @param fig фигура
     * @param x столбец поля размещения левой верхней ячейки фигуры
     * @param y строка поля размещения левой верхней ячейки фигруы
     * @return Р
     */
    public boolean FigureCheck(Figure fig,int x,int y) {
        for (int fig_y=0; fig_y<fig.getPcs().length; fig_y++) {
           for (int fig_x=0; fig_x<fig.getPcs()[fig_y].length; fig_x++ ) {
               if (fig.getPcs()[fig_y][fig_x] == 1) {
                   /**
                    * Проверка что ячейка вышла за границы поля
                    */
                   if ((x+fig_x >= this.getX()) || (y+fig_y >= this.getY())) 
                       return false;
                   /**
                    * Проверка что ячейка поля уже занята другой фигурой
                    */
                   if (this.Cells[y+fig_y][x+fig_x].getFig_number() != 0) 
                        return false;
               }
           }
        }
        return true;
    }

    void FigureDelete(Figure fig) {
        int place_x;
        int place_y;
        for (int fig_y=0; fig_y<fig.getPcs().length; fig_y++) {
           for (int fig_x=0; fig_x<fig.getPcs()[fig_y].length; fig_x++ ) {
               if (fig.getPcs()[fig_y][fig_x] == 1) {
                    place_x = fig.getCell_place()[fig_y][fig_x].place_x;
                    place_y = fig.getCell_place()[fig_y][fig_x].place_y;
                    this.Cells[place_y][place_x].setFig_number(0);
                    this.Cells[place_y][place_x].setFig_x(0);
                    this.Cells[place_y][place_x].setFig_y(0);
               }
               fig.getCell_place()[fig_y][fig_x].place_x = 0;
               fig.getCell_place()[fig_y][fig_x].place_y = 0;
           }
        }
    }
}
